#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        //首先计算出前缀和
        int n = nums.size();
        vector<int> sum(n+1,0);
        for(int i = 1;i<=n;i++)
        {
            sum[i] = sum[i-1]+nums[i-1];
        }
        int ret = 0;
        unordered_map<int,int> hash;//记录前缀和sum[i]数字出现的次数
        for(auto sj:sum)
        {
            //0 1 2 3
            //k:2
            // 1  1 1 
            ret+=hash.contains(sj-k)?hash[sj-k]:0;
            hash[sj]++;//在之后的遍历中sum[i]这个数字出现了一次
        }
        return ret;
    }
};